package ar.fi.uba.celdas.correccion.planificacion.heuristicas;

import java.util.Collection;
import java.util.Iterator;

import ar.fi.uba.celdas.correccion.planificacion.HeuristicaPlanificacion;
import ar.fi.uba.celdas.correccion.planificacion.HeuristicaPlanificacionType;
import ar.fi.uba.celdas.interfaces.bc.IBaseConocimientos;
import ar.fi.uba.celdas.interfaces.bc.Regla;
import ar.fi.uba.celdas.interfaces.bc.Sensor;

public class Retraccion extends HeuristicaPlanificacion {

	public Retraccion() {
		super(HeuristicaPlanificacionType.RETRACCION);
	}

	@Override
	public void corregirRegla(Regla original, IBaseConocimientos bc) {
		System.out.println("Regla corregida utilizando la Heuristica de Retraccion");

		// Una situacion So
		Collection<Sensor> situacionInicial = bc.getEstadoAnterior();
		// Situacion siguiente Sf
		Collection<Sensor> situacionSiguiente = bc.getEstadoActual();
		// Condiciones de Ti
		Collection<Sensor> condiciones = original.getCondiciones();
		// Efectos predecidos por Ti
		Collection<Sensor> efectos = original.getPredicciones();

		if (verificarCondiciones(situacionInicial, condiciones) && !verificarPredicciones(situacionSiguiente, efectos)) {
			for (Iterator<Sensor> itPrediccion = efectos.iterator(); itPrediccion.hasNext();) {
				Sensor prediccion = itPrediccion.next();
				// Si la prediccion no se encuentra en la observacion la saco.
				if (!situacionSiguiente.contains(prediccion)) {
					itPrediccion.remove();
					System.out.println("La prediccion: " + prediccion + " fue removida");
				}
			}
		}
	}

}
